package com.gzz.orchid.common.core.util;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 *
 * @author higmd
 */
public class ReflectUtil {
    /**
     * 获取所有字段属性
     */
    public static List<Field> getDeclaredFields(Class<?> clazz) {
        // 拿到所有的字段
        List<Field> fieldList = new ArrayList<>();
        Class<?> rootClass = clazz;
        while (rootClass != null && !"java.lang.object".equalsIgnoreCase(rootClass.getName())) {
            fieldList.addAll(Arrays.asList(rootClass.getDeclaredFields()));
            // 拿到父类
            rootClass = rootClass.getSuperclass();
        }
        return fieldList;
    }

    /**
     * 通过属性名称name和类型type，从clazz获取field
     */
    public static Field findField(Class<?> clazz, String name, Class<?> type) {
        while (Object.class != clazz && clazz != null) {
            List<Field> fields = getDeclaredFields(clazz);
            for (Field field : fields) {
                if ((name == null || name.equals(field.getName())) &&
                        (type == null || type.equals(field.getType()))) {
                    return field;
                }
            }
            clazz = clazz.getSuperclass();
        }
        return null;
    }

    /**
     * 通过属性名称name，从clazz获取field
     */
    public static Field findField(Class<?> clazz, String name) {
        while (Object.class != clazz && clazz != null) {
            List<Field> fields = getDeclaredFields(clazz);
            for (Field field : fields) {
                if (name == null || name.equals(field.getName())) {
                    return field;
                }
            }
            clazz = clazz.getSuperclass();
        }
        return null;
    }

    /**
     * 给对应target对象的field赋值value
     */
    public static void setFieldValue(Field field, Object clzz, Object value) throws IllegalAccessException {
        // 获取原来的访问控制权限
        field.setAccessible(true);
        field.set(clzz, value);
        field.setAccessible(false);
    }

    /**
     * 根据属性字段field和对象target，获取的对象中字段的值
     */
    public static Object getFieldValue(Field field, Object target) throws IllegalAccessException {
        field.setAccessible(true);
        Object val = field.get(target);
        field.setAccessible(false);
        return val;
    }

//    //根据类，方法名称和参数类型查找方法
//    public static Method findMethod(Class<?> clazz, String name) {
//        return null;
//    }
//
//    //根据类，方法名称和参数类型查找方法
//    public static Method findMethod(Class<?> clazz, String name, Class<?>[] paramTypes) {
//        return null;
//    }
//
//    //调用target对象的方法，无入参
//    public static Object invokeMethod(Method method, Object target) {
//        return null;
//    }
//
//    //调用target对象的方法，入参为args
//    public static Object invokeMethod(Method method, Object target, Object[] args) {
//        return null;
//    }
//
//    //判断属性是否包含特定修饰符
//    public static boolean isPublicStaticFinal(Field field) {
//        return Boolean.TRUE;
//    }
}
